package com.kaguya.vams.service.listener;

import cn.hutool.core.lang.Dict;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.kaguya.vams.domain.entity.SysDict;
import com.kaguya.vams.domain.vo.DictVo;
import com.kaguya.vams.service.SysDictService;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * EasyExcel监听器
 * @author : kaguya
 * @date : 0:19 2021/8/19
 */
public class DictExcelListener extends AnalysisEventListener<DictVo> {

    //通过有参构造方法来调用serviceImpl中的mapper，以进行数据库操作
    private SysDictService dictService;
    //数据默认值，超过默认值进行批量导入，提高性能
    private static final int BATCH_COUNT = 500;
    //临时数据存放list
    private static List<DictVo> batchList = new ArrayList<>();

    public DictExcelListener(SysDictService dictService) {
        this.dictService = dictService;
    }

    /**
     * 一行一行读取excel
     * @param dictVo
     * @param analysisContext
     */
    @Override
    public void invoke(DictVo dictVo, AnalysisContext analysisContext) {
        //每次读取一行数据，首先存入临时list中，待所有数据读取结束后，执行批量导入
        batchList.add(dictVo);
        //如果超出默认值，直接进行批量存储
        if(batchList.size()>BATCH_COUNT){
            try{
                this.saveData();
            }finally {
                //清空临时集合
                batchList.clear();
            }
        }



    }

    /**
     * 所有数据读取完后执行
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        this.saveData();
    }

    /**
     * 批量存储
     */
    private void saveData(){
        //将临时数据list的数据存入数据库
        List<SysDict> collect = batchList.stream().map(item -> {
                    //每次写一遍后，往数据库进行一次新增操作
                    SysDict dict = new SysDict();
                    //使用spring的BeanUtils将vo对象转成原对象 以存入数据库
                    BeanUtils.copyProperties(item, dict);
                    return dict;
                }
        ).collect(Collectors.toList());

        dictService.saveBatch(collect);
    }
}
